package com.sanjiayi.mapper;

import com.sanjiayi.pojo.Moment;
import com.sanjiayi.pojo.MomentStats;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;
import com.sanjiayi.dto.MomentDetailDTO;

@Mapper
public interface MomentMapper {
    
    /**
     * 发布动态
     */
    int publishMoment(Moment moment);
    
    /**
     * 分页查询用户动态
     */
    List<Moment> findByUserId(@Param("userId") Integer userId, @Param("start") Integer start, @Param("size") Integer size);
    
    /**
     * 获取用户动态总数
     */
    Integer countByUserId(Integer userId);
    
    /**
     * 获取用户最近的动态
     */
    List<Moment> findRecentByUserId(@Param("userId") Integer userId, @Param("limit") Integer limit);
    
    /**
     * 根据话题分页查询动态
     */
    List<Moment> findByTopic(@Param("topic") String topic, @Param("start") Integer start, @Param("size") Integer size);
    
    /**
     * 获取话题相关动态总数
     */
    Integer countByTopic(String topic);
    
    /**
     * 检查用户是否存在
     */
    Integer checkUserExists(Integer userId);
    
    /**
     * 获取用户动态统计信息
     */
    MomentStats getUserMomentStats(Integer userId);

    /**
     * 分页查询所有动态（按时间倒序）
     */
    List<Moment> findAllMoments(@Param("start") Integer start, @Param("size") Integer size);

    /**
     * 获取动态总数
     */
    Integer countAllMoments();

    /**
     * 获取热门动态（按点赞数和评论数排序）
     */
    List<Moment> findHotMoments(@Param("start") Integer start, @Param("size") Integer size);

    /**
     * 根据ID查询动态
     */
    Moment selectById(@Param("id") Integer id);

    /**
     * 根据ID获取文章详情
     * @param momentId 文章ID
     * @return 文章详情
     */
    MomentDetailDTO getMomentDetail(@Param("momentId") Integer momentId, @Param("userId") Integer userId);

    /**
     * 更新点赞数
     * @param momentId 动态ID
     * @param delta 增减数量（正数增加，负数减少）
     */
    @Update("UPDATE moment SET like_count = COALESCE(like_count, 0) + #{delta} WHERE moment_id = #{momentId}")
    int updateLikeCount(@Param("momentId") Integer momentId, @Param("delta") int delta);

    /**
     * 获取动态的点赞数
     * @param momentId 动态ID
     * @return 点赞数
     */
    @Select("SELECT like_count FROM moment WHERE moment_id = #{momentId}")
    Integer getLikeCount(@Param("momentId") Integer momentId);

    /**
     * 更新评论数
     * @param momentId 动态ID
     * @param delta 增减数量（正数增加，负数减少）
     */
    @Update("UPDATE moment SET comment_count = COALESCE(comment_count, 0) + #{delta} WHERE moment_id = #{momentId}")
    int updateCommentCount(@Param("momentId") Integer momentId, @Param("delta") int delta);

    /**
     * 获取动态的评论数
     * @param momentId 动态ID
     * @return 评论数
     */
    @Select("SELECT comment_count FROM moment WHERE moment_id = #{momentId}")
    Integer getCommentCount(@Param("momentId") Integer momentId);
    
    /**
     * 分页查询关注用户的动态
     * @param userId 当前用户ID
     * @param start 起始位置
     * @param size 每页大小
     * @return 动态列表
     */
    List<Moment> findFollowingMoments(@Param("userId") Integer userId, @Param("start") Integer start, @Param("size") Integer size);
    
    /**
     * 获取关注用户的动态总数
     * @param userId 当前用户ID
     * @return 动态总数
     */
    Integer countFollowingMoments(@Param("userId") Integer userId);
} 